package com.lbt.javaSE.digui;

import java.util.Scanner;

public class Queen {
    //斜线有多少个  2n-1
    boolean [] leftTops;     //左上角到右下角  斜线计算公式 rol -cow+7;
    boolean [] rightTops; //右上角到左下角   rol+cow
    boolean [] cols;    //列
    int queen[];
    int way=0;
    public static void main(String[] args) {
        int n;
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        new Queen().placeQueen(n);
    }
    private   void placeQueen(int n) {
        if(n<1) return;
        queen=new int[n];
        leftTops=new boolean[(n<<1)-1];
        rightTops=new boolean[(n<<1)-1];
        cols=new boolean[n];
        place(0); //从第0 列开始摆放
        System.out.println(n + "皇后一共有" + way + "种摆法");
    }

    // 从第几行开始摆放皇后       //每次都是在一行上面选上一列
    private void place(int row) {   //行
        if(row==(queen.length)){  //摆放到第7列摆放成功  重点 为什么这块写的时  length  ????? TODO 所以出口必须判断为 88
            way++;
            show();

            return;
        }
        for(int col=0;col<cols.length;col++){  //列
            if(cols[col]) {
                continue; //这一列是否摆放
            }
            int left=row-col+queen.length-1;
            if(leftTops[left]) {
                continue;  //左上 ————>右下
            }
            int right=row+col;
            if(rightTops[right]) {
                continue; //右上 ————>左下
            }
            //可以摆放皇后
            queen[row]=col;
            cols[col]=true;
            leftTops[left]=true;
            rightTops[right]=true;
            place(row+1);//开始下一行的选择 //TODO   第七个皇后选好后  就会自动++
            //回溯  恢复现场
            cols[col]=false;
            leftTops[left]=false;
            rightTops[right]=false;
        }
    }

    private void show() {
        System.out.println("---------------------------------");
        for(int i=0;i<queen.length;i++){
            for(int j=0;j<queen.length;j++){
                if(queen[i]==j){
                    System.out.print(1+" ");
                }else {
                    System.out.print(0+" ");
                }
            }
            System.out.println();
        }
    }

}
